package linux;

import com.jcraft.jsch.*;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @description: TODO 使用jcraft进行linux远程交互
 * @author: wzj
 * @create: 2019/2/18 10:11
 */
public class LinuxUtils2 {
    private static final String ENCODING = "UTF-8";

    /**
     * 获取session连接
     * @param username
     * @param host
     * @param password
     * @param port
     * @return
     * @throws JSchException
     */
    public static Session getJSchSession(String username,String host,String password,int port) {
        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(username, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");  // 第一次访问服务器时不用输入yes
            session.setTimeout(60*1000);//1min超时时间
            session.connect();
            return session;
        } catch (JSchException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 关闭session连接
     * @param session
     */
    public static void closeJSchSession(Session session){
        session.disconnect();
    }

    /**
     * 执行命令
     * @param session
     * @param command
     * @return
     * @throws IOException
     * @throws JSchException
     */
    public static String execCommandByJSch(Session session, String command) throws IOException, JSchException {
        ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
        InputStream in = channelExec.getInputStream();
        channelExec.setCommand(command);
        channelExec.setErrStream(System.err);
        channelExec.connect();

        String result = IOUtils.toString(in, ENCODING);

        channelExec.disconnect();

        return result;
    }

    /**
     * 上传单个文件
     * @param src 本机文件地址 注意是文件，不是目录
     * @param dst linux服务器文件地址
     * @param session
     * @throws JSchException
     * @throws SftpException
     */
    public static void upFile(String src,String dst,Session session) throws JSchException,SftpException {
        ChannelSftp channelSftp=(ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        channelSftp.put(src, dst);
        channelSftp.quit();
    }

    /**
     * 下载单个文件
     * @param src linux服务器文件地址 注意是文件，不是目录
     * @param dst 本地存放地址
     * @param session
     * @throws JSchException
     * @throws SftpException
     */
    public static void downFile(String src,String dst,Session session) throws JSchException, SftpException{
        ChannelSftp channelSftp=(ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        channelSftp.get(src, dst);
        channelSftp.quit();
    }

    /**
     * 批量上传文件
     * @param srcFiles 本地所有文件路径 路径分隔符应为\\
     * @param dstDir 远程linux路径 路径分隔符应为/
     * @param session
     * @throws SftpException
     * @throws JSchException
     */
    public static void batchUpFile(List<String> srcFiles,String dstDir, Session session) throws SftpException, JSchException {
        if(srcFiles!=null){
            String fileName;
            int i;
            for(String filePath : srcFiles){
                i=filePath.lastIndexOf("\\")+1;
                fileName=filePath.substring(i);
                upFile(filePath,dstDir+"/"+fileName,session);
            }
        }
    }

    /**
     * 批量下载文件
     * @param srcFiles 远程linux所有文件路径 路径分隔符应为/
     * @param dstDir 本地windows路径 路径分隔符应为\\
     * @param session
     * @throws SftpException
     * @throws JSchException
     */
    public static void batchDownFile(List<String> srcFiles,String dstDir, Session session) throws SftpException, JSchException {
        if(srcFiles!=null){
            String fileName;
            int i;
            for(String filePath : srcFiles){
                i=filePath.lastIndexOf("/")+1;
                fileName=filePath.substring(i);
                downFile(filePath,dstDir+"\\"+fileName,session);
            }
        }
    }
}
